package com.atwulidun.observer16;

import java.util.ArrayList;
import java.util.List;

// 定义被观察者接口，里面定义对观察者列表的操作方法
public interface Subject {
    // 注册观察者的方法
    void registerObserver(Observer observer);
    // 删除观察者的方法
    void removeObserver(Observer observer);
    // 通知所有观察者的方法
    void notifyObservers();
}

// Subject的具体实现类：气象局类
class WeatherBureau implements Subject{
    // 温度
    private int temperature;
    // 湿度
    private int humidity;
    // 气压
    private int pressure;

    // 维护一个观察者列表
    private List<Observer> observerList;

    public WeatherBureau() {
        observerList = new ArrayList<>();
    }

    public void set(int temperature, int humidity, int pressure) {
        this.temperature = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
        // 气象站数据更新后，要通知所有的观察者
        notifyObservers();
    }

    // 注册观察者的方法
    @Override
    public void registerObserver(Observer observer) {
        observerList.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        observerList.remove(observer);
    }

    @Override
    // 对观察者列表进行遍历，依次更新它们的属性
    public void notifyObservers() {
        for (Observer observer : observerList) {
            observer.update(temperature, humidity, pressure);
        }
    }
}
